/************************************************************
 * 文件名: sessionfriendarea.h
 * 功能描述: 会话/好友/申请列表滚动展示区声明，支持多类型Item的显示与交互。
 * 作者: 李强
 * 创建日期: [请填写日期]
 * 修改历史: 
 ************************************************************/
#ifndef SESSIONFRIENDAREA_H
#define SESSIONFRIENDAREA_H

#include <QWidget>
#include <QScrollArea>
#include <QLabel>

/////////////////////////////////////////////////////////
/// 滚动区域中的 Item 的类型
/// ///////////////////////////////////
enum ItemType{
    SessionItemType,
    FriendItemType,
    ApplyItemType
};

/////////////////////////////////////////////////////////
/// 整个滚动区域的实现
/// ///////////////////////////////////
class SessionFriendArea : public QScrollArea
{
    Q_OBJECT
public:
    explicit SessionFriendArea(QWidget *parent = nullptr);

    //清空该区域所有的 item
    void clear();

    // 添加一个 item 到该区域中, itemType 表示添加哪种 item, id 跟着不同的 itemType 有不同的含义.
    // 如果是 SessionItem, id 就是 chatSessionId
    // 如果是 FriendItem / ApplyItem, id 就是 userId
    void addItem(ItemType itemType,const QString& id, const QIcon& avatar,const QString& name, const QString& text);

    //选中某个指定的 item  通过index下标来进行选择
    void clickItem(int index);
private:
    // 后续往 container 内部的 layout 中添加元素， 就能够触发 QScrollArea 滚动效果
    QWidget* container;
signals:
};


///////////////////////////////////////////////////////
/// 滚动区域中的 Item 的实现
/// //////////////////////////////////////////////////
class SessionFriendItem  : public QWidget{
    Q_OBJECT
public:
    SessionFriendItem(QWidget* owner, const QIcon& avatar, const QString& name, const QString& text);

    void paintEvent(QPaintEvent* event) override;
    void mousePressEvent(QMouseEvent *event)override;
    void enterEvent(QEnterEvent *event)override;
    void leaveEvent(QEvent *event)override;

    void select();

    // active 函数实现 Item 被点击之后的业务逻辑
    virtual void active();  //父类不需要实现，子类重写

private:
    // owner 就指向了上述的 SessFriendArea
    QWidget* owner;



    // 这个变量用来表示当前 Item 是否时 "选中" 状态
    bool selected = false;
protected:
    //需要让这个成员被子类使用
    QLabel* messageLabel;

};

///////////////////////////////////////////////////////
/// 会话 Item 的实现
/// //////////////////////////////////////////////////

class SessionItem : public SessionFriendItem{
    Q_OBJECT
public:
    SessionItem(QWidget* owner, const QString& chatSessionId,const QIcon& avatar ,const QString& name,const QString& lastMessage);

    void active() override;
private:
    //当前会话 id
    QString chatSessionId;
};

///////////////////////////////////////////////////////
/// 好友 Item 的实现
/// //////////////////////////////////////////////////
class FriendItem : public SessionFriendItem{
    Q_OBJECT

public:
    FriendItem(QWidget* owner,const QString& userId,const QIcon& avatar,const QString& name, const QString& description);

    void active() override;

private:
    QString userId;
};


///////////////////////////////////////////////////////
/// 好友申请 Item 的实现
/// //////////////////////////////////////////////////

class ApplyItem : public SessionFriendItem{
    Q_OBJECT

public:
    //此处不需要显示一个 附加的文本了  比上面的两个Item 少
    ApplyItem(QWidget* owner, const QString& userId,const QIcon&avatar,const QString& name);

    void active() override;

private:
    //申请人的 userId
    QString userId;
};



#endif // SESSIONFRIENDAREA_H
